package reflect;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Scanner;

/*
* 使用反射机制调用方法
* */
public class reflectDemo4 {
    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
        //常规化创建实例，调用方法
        Person p = new Person();
        p.sayHello();

        //利用反射创建实例，调用方法
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入类名称");
        String className = scanner.nextLine();
        System.out.println("请输入方法名称");
        String methodeName = scanner.nextLine();
        //1.实例化对象
        //Class cls = Class.forName(reflectDemo4.class.getPackage().getName()+"."+"Person");  //获取类对象
        Class cls = Class.forName(reflectDemo4.class.getPackage().getName()+"."+className);
        Object o = cls.newInstance();   //创建类对象的实例
        //2.调用方法
        //2.1先通过类对象获取要调用的方法和方法对象
            //getMethods()获取类对象中的全部方法
        Method method = cls.getMethod(methodeName); //getMethod(方法名) 获取到类对象中指定名称的方法
        //2.2通过方法对象执行该方法
        method.invoke(o);   //调用invoke(实例) 给出需要执行的是那个实例中的方法，并且执行
    }
}
